#encoding=utf-8
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler,Imputer
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
import numpy as np
import jieba

def dictvec():
    '''
    字典数据抽取:把字典中一些类别的数据分别进行转换成特征
    :return:
    '''
    #实例化
    dict = DictVectorizer(sparse=False)

    #调用fit_transform
    data = dict.fit_transform([{'city':'beijing','temperature':100},
                               {'city': 'shanghai', 'temperature': 90},
                               {'city': 'shenzhen', 'temperature': 80},
                               {'city': 'chongqing', 'temperature': 70},
                               {'city': 'shijiazhang', 'temperature': 60},
                               {'city': 'handan', 'temperature': 50}

                               ])
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)
    return None

#文本特征抽取：用途非常广泛---文本分类 、 情感分析、
def countvec():
    '''对文本进行特征值化'''
    cv = CountVectorizer()

    data = cv.fit_transform(["life is short, I like python",
                             "life is too long, i dislike python",
                             ""
    ])
    dataChinese = cv.fit_transform(([
        "人生 苦短，我 喜欢 python",
        "人生漫长，不用python"
    ]))
    print(cv.get_feature_names())
    # print(data.toarray())

    print(dataChinese.toarray())
    return None

'''
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] 统计所有文章中所有的词
[[0 1 1 1 0 1 1 0]  对每篇文章，在词的列表里进行统计每个词出现的次数
 [1 1 1 0 1 1 0 1]] 
 单个字母不统计：没有分类的依据
 
 注意：对中文进行分类时要先进行分词  jieba
'''
def cutword():
    con1 = jieba.cut("今天很残酷， 明天更残酷，后台很美好, 但绝对大部分是死在明天晚上，所以每个人不要放弃今天")
    con2 = jieba.cut("我们看到的从很远星系来的光实在几百万年之前发出的这样当我们看到宇宙时我们实在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物，你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我结合起来我才能真正了解它")
    #转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    #把列表转换成字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1,c2,c3
def chinesevec():
    '''中文特征值化'''
    c1,c2,c3 = cutword()
    print(c1,c2,c3)
    cv = CountVectorizer()

    data = cv.fit_transform([c1,c2,c3])

    print(cv.get_feature_names())
    print(data.toarray())
    return None

def mm():
    '''
    1.归一化处理：为啥要进行归一化，用在哪里？
        答：三个特征同等重要时，进行归一化
        目的：使得某一个特征对最终结果不会造成更大影响
    2.问题：如果数据中异常点较多，会有什么影响？
        答：
    3. 应用场景
        答：在特定场景下最大值最小值是变化的，另外，最大值与最小值非常容易受异常点影响，所以
        这种方法鲁棒性较差，只适合传统精确小数据场景
    '''
    mm = MinMaxScaler(feature_range=(2,3))
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)
    return None

def stand():
    '''标准化缩放:在已有样本足够多的情况下比较稳定，适合现代嘈杂大数据场景'''
    std = StandardScaler()

    data = std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
    print(data)
    return None

def im():
    '''缺失值处理  0是列'''
    im = Imputer(missing_values='NaN', strategy='mean',axis=0)
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)

    return None

def var():
    '''
    特征选择---删除低方差的特征
    :return:
    '''
    var = VarianceThreshold(threshold=0.0)
    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
    return None

def pca():
    '''主成分分析进行降维
    '''
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
    print(data)
    return None
if __name__ == '__main__':
    # dictvec()
    # countvec()
    # chinesevec()
    # mm()
    # stand()
    # im()
    # var()
    pca()